#!/bin/bash

# 项目集进度管理系统 - 数据库备份脚本
# 用于定期备份MySQL数据库

# 配置变量
DB_HOST="localhost"
DB_PORT="3306"
DB_NAME="project_management_system"
DB_USER="your_username"
DB_PASSWORD="your_password"

# 备份目录配置
BACKUP_DIR="/backup/mysql"
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_DIR}/project_management_system_${DATE}.sql"
COMPRESSED_FILE="${BACKUP_FILE}.gz"

# 日志文件
LOG_FILE="/var/log/mysql/backup.log"

# 保留天数（默认30天）
RETENTION_DAYS=30

# 函数：记录日志
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# 函数：检查命令执行结果
check_result() {
    if [ $? -eq 0 ]; then
        log_message "SUCCESS: $1"
    else
        log_message "ERROR: $1"
        exit 1
    fi
}

# 开始备份
log_message "开始数据库备份..."

# 检查备份目录是否存在，不存在则创建
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
    check_result "创建备份目录: $BACKUP_DIR"
fi

# 执行数据库备份
log_message "正在备份数据库: $DB_NAME"
mysqldump -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    --hex-blob \
    --opt \
    --comments \
    --dump-date \
    "$DB_NAME" > "$BACKUP_FILE"

check_result "数据库备份到文件: $BACKUP_FILE"

# 压缩备份文件
log_message "正在压缩备份文件..."
gzip "$BACKUP_FILE"
check_result "备份文件压缩完成: $COMPRESSED_FILE"

# 获取压缩文件大小
FILE_SIZE=$(du -h "$COMPRESSED_FILE" | cut -f1)
log_message "备份文件大小: $FILE_SIZE"

# 删除过期的备份文件
log_message "清理过期备份文件（保留${RETENTION_DAYS}天）..."
find "$BACKUP_DIR" -name "project_management_system_*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete
check_result "过期备份文件清理完成"

# 验证备份文件完整性
log_message "验证备份文件完整性..."
gunzip -t "$COMPRESSED_FILE"
check_result "备份文件完整性验证通过"

# 显示当前备份文件列表
log_message "当前备份文件列表:"
ls -lh "$BACKUP_DIR"/project_management_system_*.sql.gz | tee -a "$LOG_FILE"

# 备份完成
log_message "数据库备份完成: $COMPRESSED_FILE"

# 可选：发送备份完成通知邮件
# 需要配置邮件服务
# echo "数据库备份完成: $COMPRESSED_FILE" | mail -s "数据库备份完成通知" admin@example.com

# 退出
exit 0